package com.nuvo.beans;

import java.text.SimpleDateFormat;
import java.util.Date;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.validation.constraints.Size;
import com.nuvo.services.MenuService;
import com.nuvo.services.TipousuarioService;
import com.nuvo.services.UsuarioService;
import com.nuvo.services.MenuTipousuarioService;
import com.nuvo.entities.Menu;
import com.nuvo.entities.Tipousuario;
import com.nuvo.entities.Usuario;
import java.io.Serializable;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;


@ManagedBean
@SessionScoped
public class HomeController implements Serializable{

    @EJB
    private UsuarioService usuarioService;
    @EJB
    private MenuService menuService;
    @EJB
    private TipousuarioService tipousuarioService;
    @EJB
    private MenuTipousuarioService MTUservice;

    @Size(min=3,message="Debe ingresar un usuario")
    private String usuario;

    @Size(min=3,message="Debe ingresar una contraseña")
    private String clave;

    @Size(min=3,message="Debe ingresar la contraseña actual")
    private String claveAct;

    @Size(min=3,message="Debe ingresar la nueva contraseña")
    private String claveNew;

    @Size(min=3,message="Debe repetir la contraseña ")
    private String claveRep;

    
    public HomeController() {
    }

    

    public String getUsuario() { return usuario; }
    public void setUsuario(String usuario) { this.usuario = usuario; }
    
    public String getClave() { return clave; }
    public void setClave(String clave) { this.clave = clave; }

    public String getClaveAct() { return claveAct; }
    public void setClaveAct(String claveAct) { this.claveAct = claveAct; }

    public String getClaveNew() { return claveNew; }
    public void setClaveNew(String claveNew) { this.claveNew = claveNew; }

    public String getClaveRep() { return claveRep; }
    public void setClaveRep(String claveRep) { this.claveRep = claveRep; }

    // --------------------- metodos del Bean ---------------------//

    public String index() {return "/home/index";} 
    public String indexpanel() {return "/index";} 

    public String acercaDe() {return "/home/acerca_de";} 

    public String login() {return "/home/login";}
    
   public String  miCuenta(){return "/home/mi_cuenta"; }
            
    public String registroCliente(){return "/home/registro";}
    
    public String contacto(){return "/home/contacto";}
     
    public String adminIndex(){return "/index";} 
    
    public void confirmarEliminar(ActionEvent actionEvent){  
        FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, "System Error",  "Please try again later.");  
          
        FacesContext.getCurrentInstance().addMessage(null, message);  
    } 
    
            

    // funcion de ingreso al sistema
    public String ingresar() {
        Usuario login = usuarioService.getLogin(usuario, clave);

        // si el login no es correcto se queda en la pagina actual.
        if (login == null) {
            SessionUtil.addErrorMessage("Usuario o Contraseña incorrectos");
            return null;
        }

        // cierra la sesion y la crea con el nuevo usuario logueado.
        SessionUtil.closeSession();
        SessionUtil.addSession(login.getId(), login.getNombre(), login.getTipousuarioId().getId(), login.getTipousuarioId().getNombre());

        return "/index";

    } 

    public String logout() {
        SessionUtil.closeSession();
        return "/home/index";
    } 

    public String cambio_clave() {
        return "/home/cambio_clave";
    } 

    // Funcion para cambiar la clave del usuario.
    public String cambiarPWD() {

        // Si las claves nueva y repetida no coinciden da error
        if (!(claveNew.equals(claveRep))) {
            SessionUtil.addErrorMessage("La nueva contraseña de ser igual a la anrerior");
            return null;
        }

        // Recupera el usuario actual para conocer su clave
        Usuario current = usuarioService.find(SessionUtil.getUserLog());
        String claveUsr = current.getClave();

        // La clave del usuario debe ser la actual
        if (!(claveAct.equals(claveUsr))) {
            SessionUtil.addErrorMessage("La clave actual no coindide con la de su usuario");
            return null;
        }

        current.setClave(claveNew);
        usuarioService.edit(current);
        return "/index";

    } 

    // Funcion que determina si hay un usuario logueado.
    public Boolean logueado() {
        Integer userLog = SessionUtil.getUserLog();
        return !(userLog == null);
    } 

    public String irA(String action) {
        return action;
    }

    public void accesoURL(Boolean ctrl, String pagina) {
        if (!tieneAcceso(ctrl, pagina)) {
            SessionUtil.redirectTo("/faces/home/acceso_denegado.xhtml");
        }
    } 

    // Determina si la pagina para el tipo de usuario puede ser accedida.
    public boolean tieneAcceso(Boolean ctrl, String pagina) {

        if (!ctrl) { return true; } // Si el indicador dice que no hay que controlar, tiene acceso.

        // Si el usuario no ingreso, no hay acceso.
        Integer userLog = SessionUtil.getUserLog();
        if (userLog == null) { return false; }

        // El usuario ingreso, si la página está en blanco, hay acceso.
        // Página en blanco indica que solo se requiere está logueado).
        if (pagina.equals("")) { return true; }

        // Si la opción de menú no existe, no hay acceso.
        Menu menu = menuService.findByAction(pagina); 
        if (menu == null) { return false; }

        // No debería pasar, pero si el tipo no existe, no hay acceso.
        Tipousuario tipo = tipousuarioService.find(SessionUtil.getIdUserTipoLog());
        if (tipo == null) { return false; }

        // Se controla acceso por menu (se busca en la tabla de accesos el tipo usuario y la página).
        return MTUservice.findByMenuAndTipousuario(menu, tipo);

    } 

    public String infoDelPie() {

        String nombre = SessionUtil.getUserNombreLog();
        String tipo = SessionUtil.getUserTipoLog();
        String usuario = "";
        if (nombre != null && tipo != null) {
           usuario = nombre + " (" + tipo + ")";
        }

        SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy h:mm a");
        Date d = new Date();
        String fechaStr = sdf.format(d);

        return usuario + " - " + fechaStr;

    } 


}
